package main
import(
	"encoding/json"
	"fmt"
)

//定义一个结构体
type Monster struct{
	Name string `json:"name"` //定义tag标签，在json序列化时，以tag为准 反射机制
	Age int `json:"age"`
	Birthday string `json:"birthday"`
	Skill string `json:"skill"`
	Sal float64 `json:"sal"`
}

//普通结构体序列化
func testStruct(){
	//演示
	monster := Monster{
		Name:"www",
		Age:500,
		Birthday:"2001-12-13 15:16:17",
		Sal:80000.0,
		Skill:"王八拳",
	}

	//将monster序列化
	by,err := json.Marshal(&monster) //值拷贝，进行值拷贝时传入引用类型优化效率
	if(err == nil){
		fmt.Println(string(by))
	}else{
		fmt.Println("转换异常。",err)
	}
}

//map序列化
func testMap(){
	//定义一个map
	var a map[string]interface{} //定义一个k为string v为任意类型的数据map
	//使用map，需要make
	a = make(map[string]interface{})
	a["name"] = "猪八戒"
	a["age"] = 5000
	a["address"] = "高老庄"
	//将a进行序列化
	//将monster序列化
	by,err := json.Marshal(a) //map默认为引用类型
	if(err == nil){
		fmt.Println(string(by))
	}else{
		fmt.Println("转换异常。",err)
	}
}

//切片序列化
func testSlice(){
	//切片
	var slice []map[string]interface{}
	var m1 map[string]interface{}
	//map需要make才可以使用
	m1 = make(map[string]interface{})
	m1["name"] = "test"
	m1["age"] = 7
	m1["address"] = "天安门广场"
	slice = append(slice,m1)
	var m2 map[string]interface{}
	//map需要make才可以使用
	m2 = make(map[string]interface{})
	m2["name"] = "test1"
	m2["age"] = 23
	m2["address"] = [3]string{"天安门","长安城","洛阳城"}
	slice = append(slice,m2)
	by,err := json.Marshal(&slice) //slice为值类型
	if(err == nil){
		fmt.Println(string(by))
	}else{
		fmt.Println("转换异常。",err)
	}
}

//反序列化map
func unmarshalMap(){
	str := "{\"address\":\"高老庄\",\"age\":5000,\"name\":\"猪八戒\"}"

	//定义一个map
	var a map[string]interface{}
	//反序列化 #反序列时会自动make 所以不需要主动make
	err := json.Unmarshal([]byte(str),&a)
	if err != nil {
		fmt.Println("反序列化失败",err)
	}
	fmt.Println(a)
}

func main(){
	//序列化测试
	testStruct()
	testMap()
	testSlice()
	//反序列化测试
	str := "{\"name\":\"www\",\"age\":500,\"birthday\":\"2001-12-13 15:16:17\",\"skill\":\"王八拳\",\"sal\":80000}"
	//定义一个Monster结构体实例
	var monster Monster
	err := json.Unmarshal([]byte(str),&monster)
	if err != nil {
		fmt.Println("反序列化失败",err)
	}
	fmt.Println(monster)
	//map反序列化
	unmarshalMap()
}
